package com.md.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author 刘骄阳
 * 2022-04-22 16:11
 */
@Configuration
public class MyApplicationContextAware implements ApplicationContextAware {
  @Resource
//  private ApiMapper apiMapper;
  public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
  }
  /**
   * 启动时执行
   */
//  @Override
//  public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
//    // 启动的时候,执行,收集api中的地址,然后判断是否有权限访问
//    Map<String, Object> beanMap = applicationContext.getBeansWithAnnotation(RestController.class);
//    List<Apis> list = Lists.newArrayList();
//    beanMap.forEach((key, value) -> {
//      Class<?> clazz = AopUtils.getTargetClass(value);
//      Type genericInterface = clazz.getGenericInterfaces()[0];
//      Method[] apiMethods = ((Class<?>) genericInterface).getMethods();
//      Map<String, Method> apiMethodMap =
//          Arrays.stream(apiMethods).collect(Collectors.toMap(Method::getName, method -> method));
//      Method[] methods = clazz.getMethods();
//      for (Method method : methods) {
//        Log log = method.getAnnotation(Log.class);
//        if (Objects.nonNull(log)) {
//          Apis api = new Apis();
//          api.setModule(log.module().getCode());
//          Method apiMethod = apiMethodMap.get(method.getName());
//          api.setName(log.title());
//          api.setAuth(log.auth().getCode());
//          api.setEnable(Boolean.TRUE);
//          PostMapping annotation = apiMethod.getAnnotation(PostMapping.class);
//          if (ObjectUtil.isEmpty(annotation)) {
//            continue;
//          }
//          String[] postMappingUrl = annotation.value();
//          for (final String url : postMappingUrl) {
//            api.setUrl(url);
//            list.add(ClassUtils.source2Target(api, Apis.class));
//          }
//        }
//      }
//    });
//    if (CollectionUtils.isEmpty(list)) {
//      return;
//    }
//    Map<String, Integer> map = list.stream().collect(Collectors.toMap(Apis::getUrl, Apis::getModule));
//    LambdaQueryWrapper<Apis> wrapper = new LambdaQueryWrapper<>();
//    // 根据url和module匹配
//    map.forEach((key, value) -> wrapper.or(andWrapper -> {
//      andWrapper.eq(Apis::getUrl, key);
//      andWrapper.eq(Apis::getModule, value);
//    }));
//    List<String> urls = apiMapper.selectList(wrapper).stream().map(Apis::getUrl).collect(Collectors.toList());
//    int size = list.size();
//    for (int i = size - 1; i >= 0; i--) {
//      // 如果包含在urls中,则代表数据库已经有了数据了
//      if (urls.contains(list.get(i).getUrl())) {
//        list.remove(i);
//      }
//    }
//    if (!CollectionUtils.isEmpty(list)) {
//      // 将不存在的地址存入数据库
//      apiMapper.insertBatchSomeColumn(list);
//    }
//  }
}
